
package kbse_jndi;
import java.util.Hashtable;
import java.util.Scanner;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;



public class FileBrowser {
    Context context;

    
    public FileBrowser(){
        context = getInitialContext();
        if(context != null) dialog();
    }
    
    
    
    // Liefert das Wurzelverzeichnis als Context-Objekt
    private Context getInitialContext(){
        Hashtable<String,String> env  = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
        env.put(Context.PROVIDER_URL, "file:///");
        try {
            return new InitialContext(env);       
        }
        catch (Exception e) {
            System.out.println( e );
            return null;
        }
    }
 
    

    // Gibt die Elemente im aktuellen Kontext auf der Konsole aus
    private void list(String type){
        try {
            NamingEnumeration<NameClassPair> files = context.list( "." );
            int i = 1;
            while( files != null && files.hasMoreElements() ) {
                NameClassPair entry = files.next();
                if( entry.getClassName().equals(type) ){
                    System.out.println( "\t " + i++ + "\t" + entry.getName() );
                }              
            }
        } catch( javax.naming.NamingException e ) { }
    }
    
    
    
    // Wechselt zum Unterverzeichnis mit der Nummer "pos"
    private void childDir(int pos){
        try {
            NamingEnumeration<NameClassPair> files = context.list( "." );
            int i = 1;
            while( files != null && files.hasMoreElements() ) {
                NameClassPair entry = files.next();
                if( entry.getClassName().equals("javax.naming.Context") ){
                    if(i++ == pos) context = (Context) context.lookup( entry.getName() ); 
                }   
            }
        } catch( javax.naming.NamingException e ) {
            System.out.println( e );
        }
        
    }
    
    
    
    // Wechselt in das übergeordnete Verzeichnis
    private void parentDir(){
        try { 
            context = (Context) context.lookup( ".." );
        } catch (NamingException ex) { }
    }
    
    
    
    // Gibt den Konsolen-Dialog aus
    private void dialog(){
        int choise;
        while(true){
            System.out.println("--------------------------------");
            System.out.println("-- (0) Programm beenden       --");
            System.out.println("-- (1) Zeige Dateien          --");
            System.out.println("-- (2) Zeige Verzeichnisse    --");
            System.out.println("-- (3) Wechsle Verzeichnis    --");
            System.out.println("-- (4) Wechsle höher          --");
            System.out.println("--------------------------------");
            
            System.out.print("Auswahl: ");
            choise = new Scanner(System.in).nextInt();
            switch( choise ){
                case 0: 
                    System.exit(0);
                    break;
                case 1:
                    list("java.io.File");
                    break;
		case 2:
                    list("javax.naming.Context");
                    break;
		case 3:
                    System.out.print("Verzeichnis-Nummer: ");
                    int dir = new Scanner(System.in).nextInt();
                    childDir(dir);
                    break;
                case 4:
                    parentDir();
                    break;
            }
        }
    }
    
    
    
    public static void main(String[] args) {
	new FileBrowser();

    }
    

}